package es.udc.fbellas.j2ee.tiendaweb.model.producto.DAO;

import java.sql.Connection;
import java.util.Iterator;
import java.util.List;

import javax.sql.DataSource;

import es.udc.fbellas.j2ee.tiendaweb.model.producto.TO.ProductoTO;
import es.udc.fbellas.j2ee.util.configuration.ConfigurationParametersManager;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;
import es.udc.fbellas.j2ee.util.sql.SimpleDataSource;

/**
 * A factory to get <code>SQLPropiedadDAO</code> objects.
 * <p>
 * Required configuration parameters:
 * <ul>
 * <li><code>SQLPropiedadDAOFactory/daoClassName</code>: it must specify the full
 * class name of the class implementing <code>SQLPropiedadDAO</code>.</li>
 * </ul>
 */
public class SQLProductoDAOFactory {

    private final static String DAO_CLASS_NAME_PARAMETER =
        "SQLProductoDAOFactory/daoClassName";

    private final static Class daoClass = getDAOClass();
    
    private SQLProductoDAOFactory() {}
    
    private static Class getDAOClass() {
    
        Class theClass = null;
    
        try {
        
            String daoClassName = ConfigurationParametersManager.getParameter(DAO_CLASS_NAME_PARAMETER);
            
            theClass = Class.forName(daoClassName);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return theClass;
        
    }
    
    public static SQLProductoDAO getDAO() throws InternalErrorException {
        
        try {        
            return (SQLProductoDAO) daoClass.newInstance();
        } catch (Exception e) {
            throw new InternalErrorException(e);
        }
        
    }
    
    /* 
     * Test code. Uncomment for testing. Test this class and any class
     * implementing "SQLPropiedadDAO".
     */         
    public static void main (String[] args) {    
        
        Connection connection = null;
    
        try {        
            
            /* Get a connection. */
            DataSource dataSource = new SimpleDataSource();
            connection = dataSource.getConnection();        
                    
            /* Get dao. */
            SQLProductoDAO dao = SQLProductoDAOFactory.getDAO();

            /* Test "SQLProductoDAO::find". */
            System.out.println("\n\nTest for 'SQLProductoDAO::find'");
          

    		ProductoTO productoTO1;
            productoTO1 = dao.find(connection,98345);
            System.out.println("productoTO1 find => " + productoTO1);
			System.out.println("----------------------------------------");
            
            /* Test "SQLProductoDAO::exists". */
            System.out.println("Test for 'SQLProductoDAO::exists'");
            if (!dao.exists(connection, productoTO1.getIdProducto())) {
                throw new Exception("Can not find producto with " +
                    "idProducto = " + 
                    productoTO1.getIdProducto());
            } 
				else {
					System.out.println("El producto SE ENCUENTRA en la base de datos");
					System.out.println("----------------------------------------");
					}
            /* Test "SQLProductDAO::findByNombre". */
            /* Get value objects in groups of 10. */            
			System.out.println("Test for 'SQLProductoDAO::findByNombre'");
            int inicio = 1;
            int elemPorGrup = 5;
            List productoTOs;
            
            do {
            
                productoTOs = dao.findByNombre(connection,
                    "MA", inicio, elemPorGrup);
                
                /* Print value objects. */    
                Iterator productoTOIterator = productoTOs.iterator();
                while (productoTOIterator.hasNext()) {
                    ProductoTO productoTO2 = (ProductoTO) productoTOIterator.next();
                    System.out.println(productoTO2);
                }
                System.out.println("----------------------------------------");
                
                inicio += elemPorGrup;
                
            } while (productoTOs.size() == elemPorGrup);

              

            /* Test "SQLAccountDAO::findByNombreCategoria". */
            System.out.println("Test for " +
                "'SQLProductoDAO::findByNombreCategoria'");     	  
            
            /* Get value objects in groups of 10. */            
            int inicio2 = 1;
            int elemPorGrup2 = 10;
            List productoTOs2;
            
            do {
            
                productoTOs2 = dao.findByNombreCategoria(connection,
                    "MA",21342, inicio2, elemPorGrup2);
                
                /* Print value objects. */    
                Iterator productoTOIterator = productoTOs2.iterator();
                while (productoTOIterator.hasNext()) {
                    ProductoTO productoTO3 = (ProductoTO) productoTOIterator.next();
                    System.out.println(productoTO3);
                }
                System.out.println("----------------------------------------");
                
                inicio2 += elemPorGrup2;
                
            } while (productoTOs2.size() == elemPorGrup2);
            
            
            /* Tests OK. */
            System.out.println("Tests OK !!!!");
        
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                GeneralOperations.closeConnection(connection);
            } catch (InternalErrorException e) {
                e.printStackTrace();
            }
        }
                
    }    
    
}
